/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.dao;

import edu.ucue.ptc.gco.mdl.Direccion;
import edu.ucue.ptc.gco.mdl.Ruta;
import edu.ucue.ptc.gco.ngc.EmpleadoManager;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Valex
 */
@Stateless
public class RutaDAO implements RutaDAOLocal {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @PersistenceContext(unitName = "edu.ucue.gped_gestionpedidosee-ejb_ejb_1.0-SNAPSHOTPU")
    private EntityManager entityManager;
    EmpleadoManager manager;

    @Override
    public void crearRuta(Ruta ruta) {
        entityManager.persist(ruta);
    }

    @Override
    public void actualizarRuta(Ruta ruta) {
        entityManager.merge(ruta);
    }

    @Override
    public void eliminarRuta(Ruta ruta) {
        Ruta toBeRemoved = entityManager.merge(ruta);
        entityManager.remove(toBeRemoved);
    }

    @Override
    public void eliminarPorId(int id) {
        Ruta p = entityManager.find(Ruta.class, id);
        if (p != null) {
            entityManager.remove(p);
        }
    }

    @Override
    public List<Ruta> listarTodosRuta() {
        Query query = entityManager.createQuery("select c from Ruta c");

        return query.getResultList();
    }

    @Override
    public Ruta obtenerRutaPorId(int idRuta) {
        Query query = entityManager.createQuery("select c from Ruta c "
                + "where c.idRuta = :pidRuta");
        query.setParameter("pidRuta", idRuta);
        List r = query.getResultList();
        if (r != null && r.size() > 0) {
            return (Ruta) r.get(0);
        } else {
            return null;
        }
        //Ruta ruta = (Ruta) query.getSingleResult();

        //return ruta;
    }
    
    @Override
    public List<Direccion> obtenerDireccionRutaPorId(int idRuta) {
        Ruta rut=obtenerRutaPorId(idRuta);
        List<Direccion> ldir=new ArrayList<Direccion>();
        if (rut!=null){
            ldir.addAll(rut.getDirecciones());
        }
        return ldir;
    }

    /**
     *
     * @param idRuta
     * @return
     */
    /* @Override
     public List<RutaDireccion> obtenerDireccionesRuta(int idRuta) {
     Query query = entityManager.createQuery("select c from RutaDireccion c "
     + "where c.idRuta = :pidRuta");
     query.setParameter("pidRuta", idRuta);
     //RutaDireccion ruta = (RutaDireccion)query.getSingleResult();
     List<RutaDireccion> lista = query.getResultList();
     return lista;
     }*/
    @Override
    public List<Ruta> rutasEmpleado(int idEmpleado) throws AtributoInvalidoException {
        Query query = entityManager.createQuery("select c from Ruta c "
                + "where c.empleado.idPersona = :pidEmpleado");
        query.setParameter("pidEmpleado", idEmpleado);
        return query.getResultList();
    }
    
    @Override
    public Ruta rutaEmpleado(int idEmpleado){
        Query query = entityManager.createQuery("select c from Ruta c "
                + "where c.empleado.idPersona = :pidEmpleado and c.fecha = :today");
        query.setParameter("pidEmpleado", idEmpleado);
        query.setParameter("today", new Date());
        List r = query.getResultList();
        if (r != null && r.size() > 0) {
            return (Ruta) r.get(0);
        } else {
            return null;
        }
       
    }
    
    @Override
    public Ruta agregarDireccion(int idRuta,Direccion direccion){
        Ruta ruta=obtenerRutaPorId(idRuta);
        if (ruta!=null){
            if (direccion!=null){
                ruta.getDirecciones().add(direccion);
                entityManager.merge(ruta);
            }
        }
        return ruta;
    }
    
    @Override
    public Ruta quitarDireccion(int idRuta,Direccion direccion){
        Ruta ruta=obtenerRutaPorId(idRuta);
        Direccion newDir=new Direccion();
        int i=0;
        for (Direccion dir:ruta.getDirecciones()){
            if (dir.getIdDireccion()==direccion.getIdDireccion()){
                newDir=dir;
                break;
            }
            else{
                i++;
            }
        }
        if (newDir.getIdDireccion()>0){
            ruta.getDirecciones().remove(i);
            entityManager.merge(ruta);
            entityManager.flush();
        }
        return ruta;
    }
}
